package com.itheima.tliasmanagementspringboot.config;

import com.itheima.tliasmanagementspringboot.interceptor.LoginCheckInterceptor;
import com.itheima.tliasmanagementspringboot.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Web工程配置类(能干的事情很多:如:拦截器, 释放静态资源html, 切换消息转换器)
 */
/*@Configuration*/
public class WebConfig implements WebMvcConfigurer {

    //自定义的拦截对象
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册自定义拦截对象
        registry.addInterceptor(loginCheckInterceptor)
                .addPathPatterns("/**")//设置拦截器拦截的请求路径（ /** 表示拦截所有请求）
                .excludePathPatterns("/login")//不拦截的路径
                //排除knife4j相关的资源
                .excludePathPatterns("/doc.html", "/swagger-resources/**", "/webjars/**", "/v3/api-docs/**");
        /* WebMvcConfigurer.super.addInterceptors(registry);*/
        /*
| 拦截路径  | 含义                | 举例
| --------- | ----------------- | ---------------------------------------
| /*        | 一级路径           | 能匹配/depts，/emps，/login，不能匹配 /depts/1
| /**       | 任意级路径          | 能匹配/depts，/depts/1，/depts/1/2
| /depts/*  | /depts下的一级路径  | 能匹配/depts/1，不能匹配/depts/1/2，/depts
| /depts/** | /depts下的任意级路径| 能匹配/depts，/depts/1，/depts/1/2，不能匹配/emps/1
        */
    }

    //JDK实现动态代理
  /*  @Autowired
    EmpService empService;//此处注入的目的是将目标对象的代理放入IOC容器中

    @Bean //将方法的返回值放入IOC容器，方法名就是对象的名称
    public EmpService empService() {
        //1. 目标对象 empService

        //2. 目标对象创建代理对象,JDK实现动态代理
        //代理只是和实现类实现了相同的接口,二者没有并没有直接的联系
                //参数1：用于指定一个类加载器
                //参数2：指定生成的代理长什么样子，也就是有哪些方法
                //参数3：用来指定生成的代理对象要干什么事情
        EmpService proxy = (EmpService) Proxy.newProxyInstance(
                empService.getClass().getClassLoader(), //目标对象的类加载器
                empService.getClass().getInterfaces(), //目标对象实现的所有接口
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //代理对象的任何方法执行，都会执行invoke
                        System.out.println(method.getName());
                        System.out.println("前置");
                        Object invoke = method.invoke(empService, args);
                        System.out.println("后置");
                        return invoke;
                    }
                }
        );

        //返回代理对象，将代理对象放入IOC容器
        return proxy;
    }*/
}
